from __future__ import unicode_literals

from django.db import models
from django.core.exceptions import ObjectDoesNotExist

from django.contrib.auth.models import User
from encuesta.models import Puntaje_Encuesta

# utilidades para estadisticas en general
def ObtenerEvaluaciones(user_id, dimension=1):
    ''' Retorna una lista con evaluaciones hechas por el
    usuario y la dimension dada'''
    puntajes = []
    try:
        P = Puntaje_Encuesta.objects.filter(user=user_id)
        for p in P:
            if p.getDimension() == dimension:
                puntajes.append(p)
        return puntajes
    except ObjectDoesNotExist:
        return []

def ObtenerEvaluacion(user_id, punto, puntuacion=None):
    ''' Retorna el primer Puntaje_Encuesta encontrado 
    '''
    try:
        if puntuacion is None:
            P = Puntaje_Encuesta.objects.get(user=user_id,\
                                             punto=punto)
            return P
            
            #return list(P.objects.all()[0])[0]
        else:
            P = Puntaje_Encuesta.objects.get(user=user_id,\
                                             punto=punto,\
                                             puntuacion=puntuacion)
            # nota: Los query sets en django no son evaluados en la base de datos
            #       a menos que se requiera hacer uso de ellos.
            #       por eso con list() se fuerza la evaluacion
            #  ref: https://docs.djangoproject.com/en/1.11/ref/models/querysets/
            #return list(P.objects.all()[0])[0]
            return P
    except ObjectDoesNotExist:
        return None

def ExisteEvaluacion(user_id, punto=""):
    ''' Retorna si exsite o no la evaluacion especificada
    '''
    try:
        P = Puntaje_Encuesta.objects.get(user=user_id,\
                                         punto=punto)
        return True
    except ObjectDoesNotExist:
        return False

def IdUsuarioRequest(request):
    ''' Retorna el id del usuario del request dado
    '''
    id_usuario = -1
    try:
        if request.user.id is None:
            return 0
        return request.user.id
    except ObjectDoesNotExist:
        return -1

def PuntuacionTotal(punto=None):
    ''' Retorna la sumatoria de la puntuacion dado el punto '''
    if punto is None:
        return 0
    suma = 0
    try:
        P = Puntaje_Encuesta.objects.filter(punto=punto)
        for p in P:
            suma += p.puntuacion
        return suma
    except ObjectDoesNotExist:
        return 0

def NumEvaluaciones(punto=None):
    if punto is None:
        return 0
    n = 0
    try:
        P = Puntaje_Encuesta.objects.filter(punto=punto)
        for p in P:
            if p.puntuacion > 0:
                n += 1
        return n
    except ObjectDoesNotExist:
        return 0
    
def UsuarioRequest(request):
    ''' Retorna el objeto User del request dado '''
    try:
        user = User.objects.get(id=request.user.id)
        return user
    except ObjectDoesNotExist:
        return None

def OrdenarPuntos(puntajes):
    ''' Obtiene una lista de puntajes (evaluacion de encuesta) y los
    ordena segun el nombre de los puntos, por ejemplo:
    puntos = [1.1.4, 1.1.1.4, 1.2.1, 1.2.3.1, 1.1.6]
    Retorna: [1.1.1.4, 1.1.4, 1.1.6, 1.2.1, 1.2.3.1]
    '''
    lista_puntos = []
    for puntaje in puntajes:
        lista_puntos.append(puntaje["punto"])

    lista_puntos.sort()

    # reordenando
    puntajes_ordenados = []
    for punto in lista_puntos:
        for puntaje in puntajes:
            if punto == puntaje["punto"]:
                puntajes_ordenados.append(puntaje)
        
    return puntajes_ordenados

def PorcentajeLlenadoEncuesta(user_id, dimension=None):
    ''' Consulta en la base de datos por el porcentaje de lleando
    de respuestas de la encuesta en la dimension dada para el usuario.
    '''
    # ejemplo de query dado:
    # SELECT COUNT(punto) FROM encuesta_puntaje_encuesta WHERE user_id = 1 AND puntuacion > 0;
    # SELECT COUNT(punto) FROM encuesta_puntaje_encuesta WHERE user_id = 1 AND puntuacion > 0 AND .---;
    c = 0
    try:
        P = Puntaje_Encuesta.objects.filter(user=user_id)
        for p in P:
            if p.getDimension() == int(dimension) and p.puntuacion > 0:
                c += 1
    except ObjectDoesNotExist:
        c = 0

    # calculando porcentaje de cumplimiento
    if int(dimension) == 1:
        return c*100/22
    elif int(dimension) == 2:
        return c*100/81
    elif int(dimension) == 3:
        return c*100/49
    elif int(dimension) == 4:
        return c*100/49
    return 0






